package com;

import java.util.Random;
import java.util.Scanner;

/**
 * 2、两人五子棋游戏
 */
public class GoBang {

    private int[][] arr = new int[17][17];

    //绘制棋盘
    void show() {
        for (int i = 0; i < 17; i++) {
            for (int j = 0; j < 17; j++) {
                if (i == 0 && j == 0)
                    System.out.print("\t");
                else {
                    //绘制第一行
                    if (i == 0) {
                        if (j <= 10)
                            System.out.print(j - 1 + "\t");
                        else
                            System.out.print((char) (j + 86) + "\t");
                    }
                    //绘制第一列
                    else if (j == 0) {
                        if (i <= 10)
                            System.out.print(i - 1 + "\t");
                        else
                            System.out.print((char) (i + 86) + "\t");
                    }
                    //下棋位置
                    else {
                        switch (arr[i][j]) {
                            case 1:
                                System.out.print("黑\t");
                                break;
                            case 2:
                                System.out.print("白\t");
                                break;
                            default:
                                System.out.print("+\t");
                        }
                    }
                }
            }
            System.out.println();
        }
    }

    //黑方和白方分别下棋，重新绘制棋盘
    boolean Go(int f) {
        int row, col;
        //一直循环，直到输入位置合理为止
        while (true) {
            if(f==1)
                System.out.println("黑方");
            else
                System.out.println("白方");
            System.out.println("请输入你要落棋的行坐标编号：");
            row = GetValue();
            System.out.println("请输入你要落棋的列坐标编号：");
            col = GetValue();
            //输入坐标在0~16之间，满足坐标要求
            if (row >= 0 && row < 16) {
                //还未有人走这个位置
                if (arr[row + 1][col + 1] == 0) {
                    arr[row + 1][col + 1] = f;
                    //输出横纵坐标
                    System.out.println("row为：" + row + "\t" + "col为：" + col);
                    break;
                } else {
                    System.out.println("该位置已经有人走过,请重新选择位置");
                }
            } else {
                System.out.println("输入坐标越界！");
            }
        }

        //一个人下完以后重新显示棋盘
        show();
        //检查是否有人胜利，因为棋盘第一列和第一行占据了，所有横纵坐标+1
        if (Check(row + 1, col + 1, f))
            return true;
        return false;
    }

    //检查是否获胜
    boolean Check(int row, int col, int f) {
        int cnt = 0;
        //判断竖直位置，从刚刚落棋的位置向竖直方向开始计算
        int temp1 = row, temp2 = col;
        while (temp1 >= 1 && arr[temp1--][col] == f)
            cnt++;
        temp1 = row + 1;
        while (temp1 <= 16 && arr[temp1++][col] == f)
            cnt++;
        if (cnt == 5)
            return true;

        //竖直不满足，计数器归零
        cnt = 0;
        //判断水平位置,从刚刚落棋的位置向两边开始计算
        for (int i = col; i > col - 5; i--) {
            if (i >= 1 && arr[row][i] == f)
                cnt++;
            else
                break;
        }
        for (int i = col + 1; i < col + 5; i++) {
            if (i <= 16 && arr[row][i] == f)
                cnt++;
            else
                break;
        }
        if (cnt == 5)
            return true;

        //判断左上到右下
        cnt = 0;
        temp1 = row;
        temp2 = col;
        while (temp1 >= 1 && temp2 >= 1 && arr[temp1--][temp2--] == f)
            cnt++;
        temp1 = row + 1;
        temp2 = col + 1;
        while (temp1 <= 16 && temp2 <= 16 && arr[temp1++][temp2++] == f)
            cnt++;
        if (cnt == 5)
            return true;

        //判断右上到左下
        cnt = 0;
        temp1 = row;
        temp2 = col;
        while (temp1 >= 1 && temp2 <= 16 && arr[temp1--][temp2++] == f)
            cnt++;
        temp1 = row + 1;
        temp2 = col - 1;
        while (temp1 <= 16 && temp2 >= 1 && arr[temp1++][temp2--] == f)
            cnt++;
        if (cnt == 5)
            return true;
        return false;
    }


    // 用户输入棋盘编号是整数0~9或者字符a~f，需将其转变为0~15坐标
    public static int GetValue() {
        Scanner scanner = new Scanner(System.in);
        //'0'字符对应的ASCII为48，
        String temp = scanner.nextLine();
        //输入坐标不符合棋盘上标识的编号
        if (temp.length() > 1)
            return -1;
        int value = temp.charAt(0) - 48;
        //row大于9说明输入的坐标编号为字母a~f或者用户输入越界,a的ASCII为97
        if (value > 9)
            value -= 39;
        return value;
    }

    public static void main(String[] args) {

        GoBang goBang = new GoBang();
        //绘制棋盘最初形式
        // goBang.show();

        Random random = new Random();
        //随机生成一个数字，看哪方先下棋，1为黑方先走，2为白方先走
        int f = random.nextInt(2) + 1;

        //双方开始下棋,如果没人获胜，则一直下棋
        for (; ; ) {
            if (goBang.Go(f))
                break;
            //两人轮流下棋
            if (f == 1)
                f = 2;
            else if (f == 2)
                f = 1;
        }

        if (f == 1)
            System.out.println("黑方获胜！！！");
        else
            System.out.println("白方获胜！！！");
    }
}
